package com.zx._12_算法.algorithm;

import java.util.Arrays;
import org.junit.Test;

public class ArrayTest {

    /**
     * 给定一个数组，找到两个数使得它们相加之和等于目标数。
     * 函数应该返回这两个下标值 index1 和 index2，其中 index1 必须小于 index2
     *
     * @date: 2019年11月3日下午9:13:31
     * @author: zhangxue
     */
    @Test
    public void test1() {
        int[] nums = {12, 7, 11, 2};
        int target = 10;
        int slow = 0;
        int fast = 1;
        int len = nums.length;
        int[] result = new int[2];
        while (true) {
            if (nums[slow] + nums[fast] == target) {
                result[0] = slow;
                result[1] = fast;
                break;
            }
            // 快指针已经走到头了，就开始新的一轮循环
            if (fast == len - 1) {
                slow++;
                fast = slow + 1;
            } else {
                fast++;
            }
            // 慢指针也走到头的话就说明数组中没有答案，直接退出
            if (slow == len - 1) {
                break;
            }
        }
        System.out.println(Arrays.toString(result));
    }

    /**
     * 给定一个已按照 升序排列 的有序数组，找到两个数使得它们相加之和等于目标数。
     * 函数应该返回这两个下标值 index1 和 index2，其中 index1 必须小于 index2
     *
     * @date: 2019年11月3日下午9:13:31
     * @author: zhangxue
     */
    @Test
    public void test2() {
        // 利用有序的这个特征
        int[] nums = {2, 7, 11, 12};
        int target = 9;
        int slow = 0;
        int fast = nums.length - 1;
        int[] result = new int[2];
        while (slow < fast) {
            int sum = nums[slow] + nums[fast];
            if (sum == target) {
                result[0] = slow;
                result[1] = fast;
                break;
            } else if (sum < target) {
                slow++;
            } else {
                fast--;
            }
        }
        System.out.println(Arrays.toString(result));
    }

}
